package com.ep.instruktor.harmonogram;

import java.util.Date;
import java.util.HashSet;

import com.ep.general.ActionSupportCustom;
import com.ep.general.RodzajUzytkownika;
import com.ep.general.app.Utils;
import com.ep.general.instruktor.Instruktor;
import com.ep.general.instruktor.InstruktorMdt;
import com.ep.instruktor.app.login.LoginRequierd;
import com.ep.instruktor.harmonogram.db.HarmonogramKursant;
import com.ep.instruktor.harmonogram.db.HarmonogramKursu;
import com.ep.instruktor.komunikat.KomunikatAction;

public class HarmonogramKursuAction extends ActionSupportCustom<Instruktor> implements LoginRequierd {

	private static final long serialVersionUID = -4434652070365973178L;
	private HarmonogramKursuView view;
	private HarmonogramKursuMdt harmonogramMdt;
	private HarmonogramKursuForm form;
	private int harmonogramId;
	private boolean czyPowiadomicKursantow;
	private final String HARMONOGRAM_KEY = "harmonogramKursuKey";

	public String list() {
		setDataArray(getView().get());
		return DATA_ARRAY;
	}

	public String listMiesiac() {
		setDataArray(getView().getMonth());
		return DATA_ARRAY;
	}

	public String listTydzien() {
		setDataArray(getView().getWeek());
		return DATA_ARRAY;
	}

	public String listKursanci() {
		setDataArray(getView().getKursanciData());
		return DATA_ARRAY;
	}

	public String listRezerwacjaPlacu() {
		setDataArray(getView().getRezerwacjePlacuData());
		return DATA_ARRAY;
	}

	private HarmonogramKursu newItem() {
		HarmonogramKursu item = new HarmonogramKursu();

		item.setData(new Date());
		item.setGodzinaPoczatkowa("07:00");
		item.setGodzinaKoncowa("22:00");
		item.setKursanci(new HashSet<HarmonogramKursant>());
		item.setPlacManewrowy(null);
		item.setInstruktor(getLoggedUser());

		return item;
	}

	public String add() {
		getForm().setData(newItem());
		getSession().remove(HARMONOGRAM_KEY);
		getSession().put(HARMONOGRAM_KEY, getForm());

		return EDIT;
	}

	public String edit() {
		HarmonogramKursu harmonogramKursu = getHarmonogramMdt().get(harmonogramId);
		getSession().remove(HARMONOGRAM_KEY);

		getForm().setData(harmonogramKursu);
		getSession().put(HARMONOGRAM_KEY, getForm());
		return EDIT;
	}

	public String delete() {
		HarmonogramKursu entity = getHarmonogramMdt().get(harmonogramId);
		if (entity == null) {
			setText("Nie znaleziono harmonogramu");
			return TEXT_RESULT;
		}

		HarmonogramKursantMdt harmonogramKursantMdt = new HarmonogramKursantMdt();
		for (HarmonogramKursant item : entity.getKursanci()) {
			harmonogramKursantMdt.delete(item);
		}

		getHarmonogramMdt().delete(entity);

		setText("Harmonogram został poprawnie usunięty");
		return TEXT_RESULT;
	}

	private boolean isValid(HarmonogramKursu data) {
		if (data.getData() == null) {
			setText("Proszę wybrać datę harmonogramu");
			return false;
		}

		if (data.getData().before(new Date())) {
			setText("Wybrana data jest mniejsza niż data aktualna");
			return false;
		}
		// if (data.getGodzinaKoncowa() < data.getGodzinaPoczatkowa()) {
		// setText("Nieprawidłowe godziny");
		// return false;
		// }
		if (data.getKursanci() == null || data.getKursanci().isEmpty()) {
			setText("Brak przypisanych kursantów");
			return false;
		}

		if (data.getPlacManewrowy() != null) {
			if (data.getPlacManewrowy().getData().getYear() != data.getData().getYear()
					|| data.getPlacManewrowy().getData().getMonth() != data.getData().getMonth()
					|| data.getPlacManewrowy().getData().getDay() != data.getData().getDay()) {
				setText("Daty rezerwacji harmonogramu i placu manewrowego muszą być zgodne");
				return false;
			}
		}

		return true;
	}

	public String saveNew() {
		if (getForm().getData() == null) {
			setText("Brak obiektu");
			return TEXT_RESULT;
		}

		if (!isValid(getForm().getData())) {
			return TEXT_RESULT;
		}

		getForm().getData().setInstruktor(new InstruktorMdt().get(getLoggedUser().getId()));
		HarmonogramKursu entity = getHarmonogramMdt().makePersistent(getForm().getData());
		saveKursanci(entity);

		String textResponse = "Nowy harmonogram został poprawnie utworzony<br/><br/>";
		if (czyPowiadomicKursantow) {
			textResponse += "Wybrani kursanci zostali powiadomieni";
			wyslijPowiadomienie(entity);
		}

		setText(textResponse);
		return TEXT_RESULT;
	}

	private void wyslijPowiadomienie(HarmonogramKursu entity) {
		StringBuilder messageContent = new StringBuilder();
		messageContent.append("<p><strong>Dzień: </strong>" + Utils.convertDMY(entity.getData()) + "</p>");
		messageContent.append("<p><strong>Od godziny: </strong>" + entity.getGodzinaPoczatkowa() + "</p>");
		messageContent.append("<p><strong>Do godziny: </strong>" + entity.getGodzinaKoncowa() + "</p>");
		messageContent.append("<p><strong>Plac manewrowy : </strong>");
		messageContent.append((entity.getPlacManewrowy() != null) ? "TAK " : "NIE");
		messageContent.append("<br/><p>Pozdrawiam</p></br/>");

		KomunikatAction komunikatAction = new KomunikatAction();
		komunikatAction.setMessageTopic("Nowy temin kursu");
		komunikatAction.setMessageContent(messageContent.toString());

		String odbiorcy = "{odbiorcy: [";

		for (HarmonogramKursant item : entity.getKursanci()) {
			odbiorcy += "{ id:'" + item.getKursant().getId() + "', imie:'" + item.getKursant().getImie()
					+ "', nazwisko:'" + item.getKursant().getNazwisko() + "', rodzaj:'" + RodzajUzytkownika.KURSANT
					+ "' },";
		}

		odbiorcy += "]}";
		komunikatAction.setMessageRecivers(odbiorcy);
		komunikatAction.setSession(getSession());
		komunikatAction.send();
	}

	public String save() {
		HarmonogramKursu harmonogramEdytowany = ((HarmonogramKursuForm) getSession().get(HARMONOGRAM_KEY)).getData();
		HarmonogramKursu harmonogramNowy = getForm().getData();

		if (harmonogramEdytowany == null) {
			setText("Brak harmonogramu !");
			return TEXT_RESULT;
		}

		if (!isValid(harmonogramNowy)) {
			return TEXT_RESULT;
		}

		harmonogramNowy.setInstruktor(getLoggedUser());
		harmonogramEdytowany.setInstruktor(getLoggedUser());

		if (!harmonogramEdytowany.compareAndCopy(harmonogramNowy)) {
			setText("Brak zmian po edycji !");
			return TEXT_RESULT;
		}

		HarmonogramKursu entity = getHarmonogramMdt().makePersistent(harmonogramEdytowany);
		HarmonogramKursantMdt harmonogramKursantMdt = new HarmonogramKursantMdt();

		for (HarmonogramKursant item : harmonogramEdytowany.getKursanci()) {
			harmonogramKursantMdt.delete(item);
		}

		for (HarmonogramKursant item : harmonogramNowy.getKursanci()) {
			item.setHarmonogram(entity);
			harmonogramKursantMdt.makePersistent(item);
		}

		entity.setKursanci(harmonogramNowy.getKursanci());
		String textResponse = "Harmonogram został poprawnie zmieniony<br/><br/>";
		if (czyPowiadomicKursantow) {
			textResponse += "Wybrani kursanci zostali powiadomieni";
			wyslijPowiadomienie(entity);
		}

		setText(textResponse);
		return TEXT_RESULT;
	}

	private void saveKursanci(HarmonogramKursu entity) {
		HarmonogramKursantMdt harmonogramKursantMdt = new HarmonogramKursantMdt();
		for (HarmonogramKursant item : entity.getKursanci()) {
			item.setHarmonogram(entity);
			harmonogramKursantMdt.makePersistent(item);
		}
	}

	private HarmonogramKursuView getView() {
		if (view == null)
			view = new HarmonogramKursuView(getLoggedUser().getId());
		return view;
	}

	private HarmonogramKursuMdt getHarmonogramMdt() {
		if (harmonogramMdt == null)
			harmonogramMdt = new HarmonogramKursuMdt();
		return harmonogramMdt;
	}

	public HarmonogramKursuForm getForm() {
		if (form == null)
			form = new HarmonogramKursuForm();
		return form;
	}

	public void setForm(HarmonogramKursuForm form) {
		this.form = form;
	}

	public int getHarmonogramId() {
		return harmonogramId;
	}

	public void setHarmonogramId(int harmonogramId) {
		this.harmonogramId = harmonogramId;
	}

	public boolean getCzyPowiadomicKursantow() {
		return czyPowiadomicKursantow;
	}

	public void setCzyPowiadomicKursantow(boolean czyPowiadomicKursantow) {
		this.czyPowiadomicKursantow = czyPowiadomicKursantow;
	}
}
